/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CONTROLLER;

import DAO.*;
import MODEL.*;
import VIEW.ProjetoFinal;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.text.Text;
import javafx.util.Callback;
import javax.swing.JOptionPane;

public class CaixaController implements Initializable {

    @FXML
    ListView mesas;
    @FXML
    TableView<ItensVenda> tb_consumo;
    @FXML
    TableColumn col_Produto, col_Quantia, col_Unitario, col_Total;
    @FXML
    Label lb_Total, lb_hora, lb_data;
    @FXML
    TextField tf_pago;
    @FXML
    Label lb_quantiaVendida;
    @FXML
    Text tx_data, tx_hora;
    
    Venda venda = new Venda();
    private static Mesa mesa = new Mesa();
    public static Thread relogio; 
    
    
    public static Mesa getMesa() {
        return mesa;
    }
    
    @FXML
    public void cadastraProdutos(ActionEvent event){
        ProjetoFinal.getInstance().gotoCadastraProdutos();
            System.out.println("OK");
        
            //System.out.println("Erro");
        
    }
    
    @FXML
    public void about(ActionEvent ev){
        ProjetoFinal.getInstance().gotoAbout();
    }
    
    @FXML
    public void cadastraFuncionario(ActionEvent event){
        System.out.println("OK");
        ProjetoFinal.getInstance().gotoCadastraFuncionario();
    }
    
    @FXML
    public void cadastraMesa(ActionEvent event){
        System.out.println("OK");
        ProjetoFinal.getInstance().gotoCadastraMesa();
    }
    
    
    @FXML
    private void cadastraCliente(ActionEvent event) {

        if (ProjetoFinal.getInstance().gotoCadastroCliente()) {
            System.out.println("OK");
        } else {
            System.out.println("Erro");
        }
    }
    
    @FXML
    public void addItensVenda(ActionEvent event) {
        if(!mesas.getSelectionModel().isEmpty()){
            if (ProjetoFinal.getInstance().gotoPedido()) {
                System.out.println("OK");
            } else {
                System.out.println("Erro");
            }
        }else{
            JOptionPane.showMessageDialog(null, "Selecione uma mesa!");
        }
        
        
    }

    @FXML
    public void setTbProdutos(MouseEvent ev) {
        if(ev.getClickCount()==2){
            if(!mesas.getSelectionModel().isEmpty()){
               if (ProjetoFinal.getInstance().gotoPedido()) {
                   System.out.println("OK");
               } else {
                   System.out.println("Erro");
               }
            }else{
               JOptionPane.showMessageDialog(null, "Selecione uma mesa!");
           }
       }
        new Thread() {
            @Override
            public void run() {
                try {
                    Mesa m = (Mesa) mesas.getFocusModel().getFocusedItem();
                    mesa = m;
                    System.out.println(m.getCodigo());
                    DaoItensVenda iv = new DaoItensVenda();

                    List<ItensVenda> itensVendas = iv.getItensVendas(m.getCodigo());
                    tb_consumo.setItems(FXCollections.observableList(itensVendas));

                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            ObservableList<ItensVenda> items = tb_consumo.getItems();
                            Double soma = 0.0;
                            for (Iterator<ItensVenda> it = items.iterator(); it.hasNext();) {
                                ItensVenda itensVenda = it.next();
                                System.out.println("Quantia: " + itensVenda.getQuantia() + " Valor: " + itensVenda.getValor_unitario());
                                soma += (itensVenda.getQuantia() * itensVenda.getValor_unitario());
                            }
                            lb_Total.setText(soma.toString());
                            System.out.println("soma: " + soma);
                        }
                    });
                } catch (Exception e) {
                    System.out.println("Erro: " + e);
                }
            }
        }.start();
        //Produtos p = (Produtos) tb_consumo.getSelectionModel().getSelectedItem();
        //System.out.println(p.getNome());

    }
    @FXML
    public void fechaMesa(ActionEvent ac) {
        DaoVenda dv = new DaoVenda();
        if(tf_pago.getText().equals("")){
            tf_pago.setText("0.0");
        }
        try{
            if(lb_Total.getText().equals("0.0")){
                JOptionPane.showMessageDialog(null, "Nada a Receber", "Nada a Receber", JOptionPane.ERROR_MESSAGE);
            }else{
                Double troco = Double.parseDouble(tf_pago.getText())-Double.parseDouble(lb_Total.getText());
                if(troco<0.0){
                    JOptionPane.showMessageDialog(null, "Falta Dinheiro", "Falta Dinheiro", JOptionPane.ERROR_MESSAGE);
                }else{
                    JOptionPane.showMessageDialog(null, "Troco: "+troco.toString(),troco.toString(), JOptionPane.INFORMATION_MESSAGE);
                    dv.finalizaVenda(getMesa().getCodigo());
                }
            }
        }catch(Exception e){
            System.out.println(e);
        }
        
    }
    @FXML
    public void voltaLogin(ActionEvent ae){
        ProjetoFinal.getInstance().gotoLogin();
    }
    
    @FXML
    public void vizualizaCozinha(ActionEvent ae){
        ProjetoFinal.getInstance().gotoCozinha();
    }
    
    @FXML
    public void atualizarProduto(ActionEvent event){
        ProjetoFinal.getInstance().gotoAtualizarProduto();
    }
            
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // add();
        //getFuncionario();
        //getClientes();
        lb_quantiaVendida.setText("Você ja vendeu "+ProjetoFinal.getInstance().getCaixa().getVendas()+" produtos");
        
        col_Produto.setCellValueFactory(new Callback<CellDataFeatures<ItensVenda, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(CellDataFeatures<ItensVenda, String> p) {
                return new ReadOnlyObjectWrapper(p.getValue().getProduto().getNome());
            }
        });


        col_Quantia.setCellValueFactory(
                new PropertyValueFactory<ItensVenda, String>("quantia"));

        col_Unitario.setCellValueFactory(new Callback<CellDataFeatures<ItensVenda, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(CellDataFeatures<ItensVenda, String> p) {
                return new ReadOnlyObjectWrapper(p.getValue().getValor_unitario());
            }
        });
        col_Total.setCellValueFactory(new Callback<CellDataFeatures<ItensVenda, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(CellDataFeatures<ItensVenda, String> p) {
                return new ReadOnlyObjectWrapper(p.getValue().getValor_unitario() * p.getValue().getQuantia());
            }
        });

        DaoMesa m = new DaoMesa();

        mesas.setItems(FXCollections.observableList(m.getMesas()));

        AtualizaHorario();

    }

    private void AtualizaHorario() {
        final Relogio r = new Relogio();

        relogio = new Thread(){
          @Override 
          public void run() {
              try{
                while(1==1){
                    tx_data.setText("Data: "+r.getData());
                    tx_hora.setText("Horário: "+r.getHora());
                }
              }catch(Exception e){
                  System.out.println("Erro: "+e);
              }
            }
        };
        relogio.start();
      }
}
